package main

import "fmt"

// 函数的数据类型
func main()  {

	fmt.Printf("%T\n",fun1)  // 返回函数的类型
	fmt.Printf("%T\n",fun2)

	//func()
	//func(int) int

	fmt.Println(fun1)   //直接打印函数   结果为 函数的地址


	var c func(int)int   //声明一个函数类型
	fmt.Println(c)    //  没有赋值 打印为 <nil>

	c=fun2    // c和 fun2和指向同一块内存  函数名  即指向函数体的内存地址
	fmt.Println("把函数赋值给c 调用函数")
	c(333)


	//定义一个  匿名函数
	func(){
		fmt.Println("匿名函数")
	}()

	//定义一个 带参数的匿名函数
	func(a,b int){
		fmt.Println(a,b)
	}(1,2)   //传入参数 并调用


	//定义一个 带返回值 的 匿名函数
	result1 :=func(a,b int)int{
		return a+b
	}(10,20)    //调用一个匿名函数

	fmt.Println(result1)


	//定义一个 带返回值 将地址赋值 个fun3
	fun3 :=func(a,b int)int{
		fmt.Println("ddddddddddddddddd")
		return a+b
	}
	fun3(10,23)   //调用函数

}
func fun1(){}

func fun2(a int)int{
	fmt.Println("fun2的函数体")
	return 0
}